﻿    using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data;
using System.Data.SqlClient;
using vudu.ClasesDominio;

namespace vudu.Datos.SqlServer
{
    public class SqlServerHorarioPreMatricula
    {
        /// <summary>
        /// Este metodo inserta una prematricula a la base de datos
        /// </summary>
        /// <returns>retorna un int con la prematricula insertado</returns>
        public int InsertarPrematricula(Prematricula prematricula)
        {
            //se instancia un objeto de tipo conexion y sqlCommand
            //estos se utilizan para acceder a base de datos y ejecutar el stored procedure en sql server
            Conexion miConexion = new Conexion();
            SqlCommand command = new SqlCommand();
            try
            {
                miConexion.AbrirConexionBd(); //se abre una conexion a base de datos

                // se completa el objeto comando, con la informacion de la conexion , variables, y nombre del stored procedure.
                command.Connection = miConexion.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[InsertarPrematricula]";
                command.CommandTimeout = 10;

                //variables del stored procedure de sql server.
                command.Parameters.AddWithValue("@nombre", prematricula.Nombre);
                command.Parameters.AddWithValue("@fecha", prematricula.Fecha);
                command.Parameters.AddWithValue("@fk_estudiante", prematricula.Estudiante.IdEst);
                command.Parameters.AddWithValue("@idInsertado", SqlDbType.Int);

                command.Parameters["@nombre"].Direction = ParameterDirection.Input;
                command.Parameters["@fecha"].Direction = ParameterDirection.Input;
                command.Parameters["@fk_estudiante"].Direction = ParameterDirection.Input;
                command.Parameters["@idInsertado"].Direction = ParameterDirection.Output;

                //se ejecuta el comando
                command.ExecuteReader();
                //se lee la variable de tipo output para saber que id fue insertado en base de datos.
                int idInsertado = (int)command.Parameters["@idInsertado"].Value;

                return idInsertado;
            }
            catch (Exception e)
            {
                throw new Exception("No se pudo crear la prematricula, compruebe la conexion con la base de datos.");
            }
            //se cierra la conexion independientemente de que se haya detectado o no una excepcion.
            finally
            {
                miConexion.CerrarConexionBd();
            }
        }

        /// <summary>
        /// Este metodo inserta en el n a n entre prematricula y seccionPractica
        /// </summary>
        /// <returns>retorna un bool en el caso que inserte y false en el contrario</returns>
        public bool InsertarPrematriculaSeccionMateria(int fk_prematricula, int fk_practica, int fk_seccionMateria)
        {
            //se instancia un objeto de tipo conexion y sqlCommand
            //estos se utilizan para acceder a base de datos y ejecutar el stored procedure en sql server
            Conexion miConexion = new Conexion();
            SqlCommand command = new SqlCommand();
            try
            {
                //se abre una conexion a base de datos
                miConexion.AbrirConexionBd();
                // se completa el objeto comando, con la informacion de la conexion , variables, y nombre del stored procedure.
                command.Connection = miConexion.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[InsertarPrematriculaSeccionMateria]";
                command.CommandTimeout = 10;
                //variables del stored procedure de sql server.
                command.Parameters.AddWithValue("@fk_prematricula", fk_prematricula);
                command.Parameters.AddWithValue("@fk_practica", fk_practica);
                command.Parameters.AddWithValue("@fk_seccionMateria", fk_seccionMateria);

                command.Parameters["@fk_prematricula"].Direction = ParameterDirection.Input;
                command.Parameters["@fk_practica"].Direction = ParameterDirection.Input;
                command.Parameters["@fk_seccionMateria"].Direction = ParameterDirection.Input;

                //se ejecuta el comando
                command.ExecuteReader();
                return true;
            }
            catch (SqlException)
            {
                return false;
            }
            catch (Exception e)
            {
                return false;
            }
            //se cierra la conexion independientemente de que se haya detectado o no una excepcion.
            finally
            {
                miConexion.CerrarConexionBd();
            }
        }

        /// <summary>
        /// Metodo que permite consultar la informacion de un estudiante, para crear su prematricula
        /// </summary>
        public Estudiante ConsultarInformacionEstudiante(Estudiante estudiante)
        {
            //se instancia un objeto de tipo conexion y sqlCommand
            //estos se utilizan para acceder a base de datos y ejecutar el stored procedure en sql server
            Conexion miConexion = new Conexion();
            SqlCommand command = new SqlCommand();
            SqlDataReader reader = null;
            try
            {
                //se abre una conexion a base de datos
                miConexion.AbrirConexionBd();
                // se completa el objeto comando, con la informacion de la conexion , variables, y nombre del stored procedure.
                command.Connection = miConexion.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[ConsultarInformacionEstudiante]";
                command.CommandTimeout = 10;

                //variables del stored procedure de sql server.
                command.Parameters.AddWithValue("@IdEstudiante", estudiante.IdEst);
                command.Parameters["@IdEstudiante"].Direction = ParameterDirection.Input;

                //se ejecuta el comando
                Estudiante miEstudiante = new Estudiante();
                reader = command.ExecuteReader();
                while (reader.Read())
                {
                    miEstudiante.IdEst = reader.GetInt32(0);
                    miEstudiante.Nombre = reader.GetString(1);
                    miEstudiante.Apellido = reader.GetString(2);
                    miEstudiante.Cedula = reader.GetInt32(3);
                }
                return miEstudiante;
            }
            catch (SqlException)
            {
                return null;
            }
            catch (Exception e)
            {
                return null;
            }
            //se cierra la conexion independientemente de que se haya detectado o no una excepcion.
            finally
            {
                if (reader != null)
                    reader.Close();
                miConexion.CerrarConexionBd();
            }
        }

        /// <summary>
        /// Este metodo consulta en base de datos las materias de una prematricula
        /// </summary>
        public List<Materia> ConsultarMateriasPrematricula(Estudiante estudiante, int semestreActual)
        {
            //se instancia un objeto de tipo conexion y sqlCommand
            //estos se utilizan para acceder a base de datos y ejecutar el stored procedure en sql server
            Conexion miConexion = new Conexion();
            SqlCommand command = new SqlCommand();
            SqlDataReader reader = null;
            try
            {
                //se abre una conexion a base de datos
                miConexion.AbrirConexionBd();
                // se completa el objeto comando, con la informacion de la conexion , variables, y nombre del stored procedure.
                command.Connection = miConexion.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[ConsultarMateriasPrematricula]";
                command.CommandTimeout = 10;

                //variables del stored procedure de sql server.
                command.Parameters.AddWithValue("@id_estudiante",estudiante.IdEst);
                command.Parameters.AddWithValue("@semestreActual", estudiante.IdEst);

                command.Parameters["@id_estudiante"].Direction = ParameterDirection.Input;
                command.Parameters["@semestreActual"].Direction = ParameterDirection.Input;

                //se ejecuta el comando
                //se carga la informacion consultada en un objeto de tipo Evaluacion
                List<Materia> misMaterias = new List<Materia>();
                reader = command.ExecuteReader();
                while (reader.Read())
                {
                    Materia materia = new Materia();
                    materia.Codigo = reader.GetInt32(0);
                    materia.Nombre = reader.GetString(1);
                    materia.Semestre = reader.GetInt32(2);
                    materia.NumeroCreditos = reader.GetInt32(3);
                    misMaterias.Add(materia);
                }
                return misMaterias;
            }
            catch (SqlException)
            {
                return null;
            }
            catch (Exception e)
            {
                return null;
            }
            //se cierra la conexion independientemente de que se haya detectado o no una excepcion.
            finally
            {
                if (reader != null)
                    reader.Close();
                miConexion.CerrarConexionBd();
            }
        }

        /// <summary>
        /// Metodo que consulta las secciones de una materia
        /// </summary>
        /// <param name="materia">Materia que se le van a consultar las secciones</param>
        /// <returns></returns>
        public List<SeccionMateria> ConsultarSeccionesDeUnaMateria(Materia materia)
        {
            //se instancia un objeto de tipo conexion y sqlCommand
            //estos se utilizan para acceder a base de datos y ejecutar el stored procedure en sql server
            Conexion miConexion = new Conexion();
            SqlCommand command = new SqlCommand();
            SqlDataReader reader = null;
            try
            {
                //se abre una conexion a base de datos
                miConexion.AbrirConexionBd();
                // se completa el objeto comando, con la informacion de la conexion , variables, y nombre del stored procedure.
                command.Connection = miConexion.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[ConsultarSeccionesDeUnaMateria]";
                command.CommandTimeout = 10;

                //variables del stored procedure de sql server.
                command.Parameters.AddWithValue("@id_materia", materia.Codigo);
                command.Parameters["@id_materia"].Direction = ParameterDirection.Input;

                //se ejecuta el comando
                //se carga la informacion consultada en un objeto de tipo Evaluacion
                List<SeccionMateria> seccionMaterias = new List<SeccionMateria>();
                reader = command.ExecuteReader();
                while (reader.Read())
                {
                    SeccionMateria seccionMateria = new SeccionMateria();
                    seccionMateria.Codigo = reader.GetInt32(0);
                    seccionMateria.IdSeccionMateria = reader.GetInt32(1);
                    seccionMateria.Profesor.Nombre = reader.GetString(2);
                    seccionMaterias.Add(seccionMateria);
                }
                return seccionMaterias;
            }
            catch (SqlException)
            {
                return null;
            }
            catch (Exception e)
            {
                return null;
            }
            //se cierra la conexion independientemente de que se haya detectado o no una excepcion.
            finally
            {
                if (reader != null)
                    reader.Close();
                miConexion.CerrarConexionBd();
            }
        }

        /// <summary>
        /// Metodo que permite consultar el horario de clase de una seccion especifica.
        /// </summary>
        /// <param name="seccionMateria"></param>
        /// <returns></returns>
        public List<HorarioDeClase> ConsultaHorarioClaseSeccion(SeccionMateria seccionMateria)
        {
            //se instancia un objeto de tipo conexion y sqlCommand
            //estos se utilizan para acceder a base de datos y ejecutar el stored procedure en sql server
            Conexion miConexion = new Conexion();
            SqlCommand command = new SqlCommand();
            SqlDataReader reader = null;
            try
            {
                //se abre una conexion a base de datos
                miConexion.AbrirConexionBd();
                // se completa el objeto comando, con la informacion de la conexion , variables, y nombre del stored procedure.
                command.Connection = miConexion.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[ConsultaHorarioClaseSeccion]";
                command.CommandTimeout = 10;

                //variables del stored procedure de sql server.
                command.Parameters.AddWithValue("@id_seccionMateria", seccionMateria.Codigo);
                command.Parameters["@id_seccionMateria"].Direction = ParameterDirection.Input;

                //se ejecuta el comando
                //se carga la informacion consultada en un objeto de tipo Evaluacion
                List<HorarioDeClase> horarioDeClases = new List<HorarioDeClase>();
                reader = command.ExecuteReader();
                while (reader.Read())
                {
                    HorarioDeClase horarioDeClase = new HorarioDeClase();
                    horarioDeClase.IdHorarioClase = reader.GetInt32(0);
                    horarioDeClase.Dia = reader.GetString(1);
                    horarioDeClase.HoraInicio = Convert.ToDateTime(reader.GetString(2));
                    horarioDeClase.HoraFin = Convert.ToDateTime(reader.GetString(3));
                    horarioDeClases.Add(horarioDeClase);
                }
                return horarioDeClases;
            }
            catch (SqlException)
            {
                return null;
            }
            catch (Exception e)
            {
                return null;
            }
            //se cierra la conexion independientemente de que se haya detectado o no una excepcion.
            finally
            {
                if (reader != null)
                    reader.Close();
                miConexion.CerrarConexionBd();
            }
        }

        /// <summary>
        /// Metodo que permite consultar las prematriculas de una estudiante.
        /// </summary>
        /// <param name="estudiante"></param>
        /// <returns>Regresa una lista con todas las prematriculas de un estudiante.</returns>
        public List<Prematricula> ConsultarPrematricula(Estudiante estudiante)
        {
            //se instancia un objeto de tipo conexion y sqlCommand
            //estos se utilizan para acceder a base de datos y ejecutar el stored procedure en sql server
            Conexion miConexion = new Conexion();
            SqlCommand command = new SqlCommand();
            SqlDataReader reader = null;
            try
            {
                //se abre una conexion a base de datos
                miConexion.AbrirConexionBd();
                // se completa el objeto comando, con la informacion de la conexion , variables, y nombre del stored procedure.
                command.Connection = miConexion.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[ConsultarPrematricula]";
                command.CommandTimeout = 10;

                //variables del stored procedure de sql server.
                command.Parameters.AddWithValue("@IdEstudiante", estudiante.IdEst);

                command.Parameters["@IdEstudiante"].Direction = ParameterDirection.Input;

                //se ejecuta el comando
                //se carga la informacion consultada en un objeto de tipo Evaluacion
                List<Prematricula> misPrematriculas = new List<Prematricula>();
                reader = command.ExecuteReader();
                while (reader.Read())
                {
                    Prematricula prematricula = new Prematricula();
                    prematricula.Codigo = reader.GetInt32(0);
                    prematricula.Fecha = reader.GetDateTime(1);
                    prematricula.Nombre = reader.GetString(2);
                    misPrematriculas.Add(prematricula);
                }
                return misPrematriculas;
            }
            catch (SqlException)
            {
                return null;
            }
            catch (Exception e)
            {
                return null;
            }
            //se cierra la conexion independientemente de que se haya detectado o no una excepcion.
            finally
            {
                if (reader != null)
                    reader.Close();
                miConexion.CerrarConexionBd();
            }
        }

        /// <summary>
        /// Consulta la informacion de una prematricula.
        /// </summary>
        /// <param name="prematricula"></param>
        /// <returns>Retorna una lista con las secciones de esta prematricula.</returns>
        public List<SeccionMateria> ConsultarInformacionPrematricula (Prematricula prematricula)
        {
            //se instancia un objeto de tipo conexion y sqlCommand
            //estos se utilizan para acceder a base de datos y ejecutar el stored procedure en sql server
            Conexion miConexion = new Conexion();
            SqlCommand command = new SqlCommand();
            SqlDataReader reader = null;
            try
            {
                //se abre una conexion a base de datos
                miConexion.AbrirConexionBd();
                // se completa el objeto comando, con la informacion de la conexion , variables, y nombre del stored procedure.
                command.Connection = miConexion.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[ConsultarInformacionPrematricula]";
                command.CommandTimeout = 10;

                //variables del stored procedure de sql server.
                command.Parameters.AddWithValue("@IdPrematricula", prematricula.Codigo);

                command.Parameters["@IdPrematricula"].Direction = ParameterDirection.Input;

                //se ejecuta el comando
                //se carga la informacion consultada en un objeto de tipo Evaluacion
                List<SeccionMateria> misSecciones = new List<SeccionMateria>();
                reader = command.ExecuteReader();
                while (reader.Read())
                {
                    SeccionMateria seccionMateria = new SeccionMateria();
                    seccionMateria.Codigo = reader.GetInt32(1);
                    seccionMateria.IdSeccionMateria = reader.GetInt32(2);
                    seccionMateria.Materia.Nombre = reader.GetString(3);
                    seccionMateria.Profesor.Nombre = reader.GetString(4);
                    seccionMateria.Profesor.Apellido = reader.GetString(5);
                    misSecciones.Add(seccionMateria);
                }
                return misSecciones;
            }
            catch (SqlException)
            {
                return null;
            }
            catch (Exception e)
            {
                return null;
            }
            //se cierra la conexion independientemente de que se haya detectado o no una excepcion.
            finally
            {
                if (reader != null)
                    reader.Close();
                miConexion.CerrarConexionBd();
            }
        }


        public List<HorarioDeClase> ConsultarInformacionPrematriculaHorario(Prematricula prematricula)
        {
            //se instancia un objeto de tipo conexion y sqlCommand
            //estos se utilizan para acceder a base de datos y ejecutar el stored procedure en sql server
            Conexion miConexion = new Conexion();
            SqlCommand command = new SqlCommand();
            SqlDataReader reader = null;
            try
            {
                //se abre una conexion a base de datos
                miConexion.AbrirConexionBd();
                // se completa el objeto comando, con la informacion de la conexion , variables, y nombre del stored procedure.
                command.Connection = miConexion.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[ConsultarInformacionPrematriculaHorario]";
                command.CommandTimeout = 10;

                //variables del stored procedure de sql server.
                command.Parameters.AddWithValue("@IdPrematricula", prematricula.Codigo);

                command.Parameters["@IdPrematricula"].Direction = ParameterDirection.Input;

                //se ejecuta el comando
                //se carga la informacion consultada en un objeto de tipo Evaluacion
                List<HorarioDeClase> misHorarios = new List<HorarioDeClase>();
                reader = command.ExecuteReader();
                while (reader.Read())
                {
                    HorarioDeClase seccionHorario = new HorarioDeClase();
                    seccionHorario.HoraInicio = reader.GetDateTime(0);
                    seccionHorario.HoraFin = reader.GetDateTime(1);
                    seccionHorario.Dia = reader.GetString(2);
                        
                    misHorarios.Add(seccionHorario);
                }
                return misHorarios;
            }
            catch (SqlException)
            {
                return null;
            }
            catch (Exception e)
            {
                return null;
            }
            //se cierra la conexion independientemente de que se haya detectado o no una excepcion.
            finally
            {
                if (reader != null)
                    reader.Close();
                miConexion.CerrarConexionBd();
            }
        }

        /// <summary>
        /// Metodo que sirve para desactivar una prematricula en base de datos.
        /// </summary>
        /// <param name="prematricula"></param>
        /// <returns></returns>
        public bool EliminarPrematricula(Prematricula prematricula)
        {
            //se instancia un objeto de tipo conexion y sqlCommand
            //estos se utilizan para acceder a base de datos y ejecutar el stored procedure en sql server
            Conexion miConexion = new Conexion();
            SqlCommand command = new SqlCommand();
            try
            {
                //se abre una conexion a base de datos
                miConexion.AbrirConexionBd();
                // se completa el objeto comando, con la informacion de la conexion , variables, y nombre del stored procedure.
                command.Connection = miConexion.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[EliminarPrematricula]";
                command.CommandTimeout = 10;
                //variables del stored procedure de sql server.
                command.Parameters.AddWithValue("@IdPrematricula", prematricula.Codigo);
                command.Parameters["@idPrematricula"].Direction = ParameterDirection.Input;
                //se ejecuta el comando
                command.ExecuteReader();
                return true;
            }
            catch (SqlException)
            {
                return false;
            }
            catch (Exception e)
            {
                return false;
            }
            //se cierra la conexion independientemente de que se haya detectado o no una excepcion.
            finally
            {
                miConexion.CerrarConexionBd();
            }
        }
        /// <summary>
        /// Metodo que sirve para aprobar una prematricula en base de datos.
        /// </summary>
        /// <param name="prematricula"></param>
        /// <returns></returns>
        public bool AprobarPrematricula(Prematricula prematricula)
        {
            //se instancia un objeto de tipo conexion y sqlCommand
            //estos se utilizan para acceder a base de datos y ejecutar el stored procedure en sql server
            Conexion miConexion = new Conexion();
            SqlCommand command = new SqlCommand();
            try
            {
                //se abre una conexion a base de datos
                miConexion.AbrirConexionBd();
                // se completa el objeto comando, con la informacion de la conexion , variables, y nombre del stored procedure.
                command.Connection = miConexion.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[AprobarPrematricula]";
                command.CommandTimeout = 10;
                //variables del stored procedure de sql server.
                command.Parameters.AddWithValue("@id_HorarioPreMatricula", prematricula.Codigo);
                command.Parameters.AddWithValue("@id_estudiante", prematricula.Estudiante.IdEst);

                command.Parameters["@id_HorarioPreMatricula"].Direction = ParameterDirection.Input;
                command.Parameters["@id_estudiante"].Direction = ParameterDirection.Input;
                //se ejecuta el comando
                command.ExecuteReader();
                return true;
            }
            catch (SqlException)
            {
                return false;
            }
            catch (Exception e)
            {
                return false;
            }
            //se cierra la conexion independientemente de que se haya detectado o no una excepcion.
            finally
            {
                miConexion.CerrarConexionBd();
            }
        }

        /// <summary>
        /// Consulta los estudiantes que tengan prematricula.
        /// </summary>
        /// <returns></returns>
        public List<Estudiante>  ConsultarEstudiantesConPrematricula()
        {
            //se instancia un objeto de tipo conexion y sqlCommand
            //estos se utilizan para acceder a base de datos y ejecutar el stored procedure en sql server
            Conexion miConexion = new Conexion();
            SqlCommand command = new SqlCommand();
            SqlDataReader reader = null;
            try
            {
                //se abre una conexion a base de datos
                miConexion.AbrirConexionBd();
                // se completa el objeto comando, con la informacion de la conexion , variables, y nombre del stored procedure.
                command.Connection = miConexion.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[ConsultarEstudiantesConPrematricula]";
                command.CommandTimeout = 10;
                
                //se ejecuta el comando
                List<Estudiante> miEstudiantes = new List<Estudiante>();
                reader = command.ExecuteReader();
                while (reader.Read())
                {
                    Estudiante estudiante = new Estudiante();
                    estudiante.IdEst = reader.GetInt32(0);
                    estudiante.Nombre = reader.GetString(1);
                    miEstudiantes.Add(estudiante);
                }
                return miEstudiantes;
            }
            catch (SqlException)
            {
                return null;
            }
            catch (Exception e)
            {
                return null;
            }
            //se cierra la conexion independientemente de que se haya detectado o no una excepcion.
            finally
            {
                if (reader != null)
                    reader.Close();
                miConexion.CerrarConexionBd();
            }
        }
    }
}